package carte;

import graphes.*;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;
import org.xml.sax.helpers.XMLReaderFactory;

public class AppliCarte {

	/**
	 * @param args
	 */
	public static void main(String[] argv) throws Exception {
		Scanner sc = new Scanner(System.in);
		Carte G=null;
		System.out.println("Rechargement a partir d'un fichier(y/n)?");
		String choix = sc.next();
		if (choix.equals("y")) {
			System.out.println("Nom du fichier?");
			String fichier = sc.next();
			G=(Carte)Serialisation.deSerialise(fichier);
		} else {
			if (argv.length!=1){
				System.err.println("Usage: MiniMappi fileMap");
				System.exit(1);
			}
			G=chargerGraphe(argv[0]);
			System.out.println("Sauvegarde dans un fichier(y/n)?");
			choix = sc.next();
			if (choix.equals("y")) {
				System.out.println("Nom du fichier?");
				String fichier = sc.next();
				Serialisation.serialise(G,fichier);
			}
		}
		System.out.println("Ville1:");
		String ville1 = sc.next();
		System.out.println("Ville2:");
		String ville2 = sc.next();
		System.out.println("Critere:\n1)Temps\n2)Distance\n3)Cout");
		Voie.typeRecherche=sc.nextInt();
		Noeud debut = G.findNoeud(ville1);
		Noeud fin = G.findNoeud(ville2);
		System.out.println(meilleurChemin(G,debut,fin));
	}
	public static String meilleurChemin(Graphe G,Noeud debut,Noeud fin){
		String affichage="";
		List<Arc> chemin = Dijkstra.AlgoDijkstra(G, debut, fin);
		double temps = 0;
		double distance = 0;
		double prix = 0;
		affichage+="Meilleur chemin de " + debut + " à " + fin+"\n";
		for (int i = 0; i < chemin.size(); i++) {
			Arc courant = chemin.get(i);
			affichage+=courant+"\n";
			Voie.typeRecherche = Voie.TYPEDISTANCE;
			distance += courant.getPoids();
			Voie.typeRecherche = Voie.TYPETEMPS;
			temps += courant.getPoids();
			Voie.typeRecherche = Voie.TYPEPRIX;
			prix += courant.getPoids();
		}
		affichage+="Duree du trajet: " + heuresToString(temps)+"\n";
		affichage+="Distance: " + distance+" km\n";
		affichage+="Cout en euros: " + prix+"\n";
		return affichage;
	}
	public static String heuresToString(double heures) {
		String temps = "";
		temps += (int)Math.floor(heures) + "h ";
		double minutes = ((heures - Math.floor(heures)) * 60);
		temps += (int)Math.floor(minutes) + "mn ";
		double secondes = (minutes - Math.floor(minutes)) * 60;
		temps += (int)Math.ceil(secondes) + "s ";
		return temps;
	}
	public static Carte chargerGraphe(String fichierGraphe) throws SAXException, IOException{
		Carte G;
		List<Noeud> listeNoeuds = new ArrayList<Noeud>();
		List<Arc> listeArcs = new ArrayList<Arc>();
		G=new Carte();
		G.setArcs(listeArcs);
		G.setNoeuds(listeNoeuds);
		// Le parseur SAX
		XMLReader reader = XMLReaderFactory
				.createXMLReader("org.apache.xerces.parsers.SAXParser");

		// Creation d'un flot XML sur le fichier d'entree
		InputSource input = new InputSource(new FileInputStream(
				fichierGraphe));

		// Connexion du ContentHandler

		reader.setContentHandler(new MapHandler(G));
		// Lancement du traitement...
		reader.parse(input);
		return G;
	}

}
